Google Cloud Batch のジョブに Cloud Storage をマウントしてストレージ上のスクリプトを実行してみた
Google Cloud データエンジニアのはんざわです。
前回のブログで Google Cloud の Batch を使って、Cloud Storage のファイルを解凍する方法を紹介しました。
今回のブログでは、Batch に Cloud Storage をマウントし、ストレージに配置したスクリプトを実行する方法を紹介します。
スクリプトの実行方法
前回のブログでも紹介したとおり、Batch ではコンテナイメージを使用して実行する方法と、直接スクリプトから実行する方法の2つがあります。
さらに直接スクリプトから実行する方法にも2つの方法があります。
- Batch API に直接スクリプトを渡す方法
- 事前にスクリプトファイルを配置したストレージボリュームにマウントする方法
前回のブログで実行した以下のコマンドは、前者の「Batch API に直接スクリプトを渡す方法」に該当します。
$ gcloud beta batch jobs submit \
--location asia-northeast1 \
--config ./job.json \
--script-text "$(cat ./script.sh)"
今回のブログでは、後者の方法でスクリプトを実行する手順を紹介します。
やりたいこと
今回やりたいことは、以下のとおりです。
- Cloud Storage に実行するスクリプトファイルを配置する
- Batch に Cloud Storage をマウントし、ストレージ上のスクリプトを呼び出す
事前準備
一部のリソースは、前回の検証で使用したものを再利用します。
- サービスアカウント
- 圧縮されたファイルを保管する Cloud Storage
- 解凍したファイルを保管する Cloud Storage
- 実行するスクリプト
1. Cloud Storage
以下のコマンドで、Batch のジョブが実行される Compute Engine がマウントするための Cloud Storage を作成します。
# Batch がマウントする Cloud Storage を作成
$ gcloud storage buckets create gs://hanzawa-yuya-batch-mount \
--location=asia-northeast1 \
--uniform-bucket-level-access
2. スクリプトファイルを Cloud Storage にアップロード
以下のコマンドで、スクリプトファイルをマウントされる Cloud Storage にアップロードします。
$ gcloud storage cp ./script.sh gs://hanzawa-yuya-batch-mount/test/
3. Batch
ジョブの定義ファイルを準備します。
前回作成したものとほとんど同じですが、異なる部分だけハイライトしています。
変更点の概要は以下のとおりです。
runnables[].script.path
で Compute Engine のスクリプトファイルのパスを指定volumes[].gcs.remotePath
で Cloud Storage のリモートパスを指定volumes[].mountPath
でストレージボリュームのマウントパスを指定
それぞれのパラメータの詳細については、上記の REST API Resource の公式ドキュメントを参考にしてください。
{
"taskGroups": [
{
"taskSpec": {
+ "runnables": [
+ {
+ "script": {
+ "path": "/scripts/script.sh"
+ }
+ }
+ ],
"computeResource": {
"cpuMilli": "500",
"memoryMib": "500"
},
"environment": {
"variables": {
"FILE_PATH": "test/sample.csv.gz",
"INPUT_BUCKET": "hanzawa-yuya-compressed-files",
"OUTPUT_BUCKET": "hanzawa-yuya-uncompressed-files"
}
},
+ "volumes": [
+ {
+ "gcs": {
+ "remotePath": "hanzawa-yuya-batch-mount/test"
+ },
+ "mountPath": "/scripts"
+ }
+ ]
}
}
],
"allocationPolicy": {
"location": {
"allowedLocations": [
"regions/asia-northeast1"
]
},
"instances": [
{
"policy": {
"machineType": "e2-micro",
"provisioningModel": "STANDARD"
}
}
],
"serviceAccount": {
"email": "sa-batch@<PROJECT_ID>.iam.gserviceaccount.com"
}
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
動かしてみる
早速、動かしてみます。以下のコマンドで Batch ジョブを作成します。
$ gcloud beta batch jobs submit \
--location asia-northeast1 \
--config ./job.json
期待通り、解凍処理が正常に行われました。
また、ログを確認すると Cloud Storage へのマウントも成功していました。
ログからもわかるように、Cloud Storage のマウントには gcsfuse
が使用されています。gcsfuse
は、Cloud Storage をローカルファイルシステムとしてマウントするためのツールです。
詳細は以下のドキュメントを参照してください。
まとめ
本ブログでは、Google Cloud Batch のジョブに Cloud Storage をマウントしてストレージ上のスクリプトを実行してみました。
今回の検証ではスクリプトの読み取りのみを行いましたが、Cloud Storage にファイルを書き込むことも可能ですので、ぜひ試してみてください。